package cn.always.xiajia.admin.sys.service;

import java.util.Collection;
import java.util.List;
import java.util.Set;

import cn.always.xiajia.admin.sys.entity.SysMenu;
import cn.always.xiajia.framework.common.entity.AjaxResult;
import cn.always.xiajia.framework.mybatis.core.service.BaseServiceX;

/**
 * 
 * @author xgj
 *
 */
public interface SysMenuService extends BaseServiceX<SysMenu> {

	/**
	 * 获得权限对应的菜单编号数组
	 *
	 * @param perms 权限标识
	 * @return 数组
	 */
	Set<Long> getMenuIdByPerms(String perms);

	/**
	 * 判断是否有权限，任一一个即可
	 *
	 * @param userId 用户编号
	 * @param permissions 权限
	 * @return 是否
	 */
	boolean hasAnyPermissions(Long userId, String... permissions);

	/**
	 * 判断是否有角色，任一一个即可
	 *
	 * @param roles 角色数组
	 * @return 是否
	 */
	boolean hasAnyRoles(Long userId, String... roles);

	// ========== 角色-菜单的相关方法 ==========
	/**
	 * 设置角色菜单
	 *
	 * @param roleId 角色编号
	 * @param menuIds 菜单编号集合
	 */
	AjaxResult assignRoleMenu(Long roleId, Set<Long> menuIds);

	/**
	 * 处理角色删除时，删除关联授权数据
	 *
	 * @param roleId 角色编号
	 */
	AjaxResult processRoleDeleted(Long roleId);

	/**
	 * 处理菜单删除时，删除关联授权数据
	 *
	 * @param menuId 菜单编号
	 */
	AjaxResult processMenuDeleted(Long menuId);

	// ========== 用户-角色的相关方法 ==========
	/**
	 * 设置用户角色
	 *
	 * @param userId 角色编号
	 * @param roleIds 角色编号集合
	 */
	AjaxResult assignUserRole(Long userId, Set<Long> roleIds);

	/**
	 * 处理用户删除时，删除关联授权数据
	 *
	 * @param userId 用户编号
	 */
	AjaxResult processUserDeleted(Long userId);

	// ========== 用户-岗位的相关方法 ==========
	/**
	 * 设置用户岗位
	 *
	 * @param userId 角色编号
	 * @param postIds 岗位编号集合
	 */
	AjaxResult assignUserPost(Long userId, Set<Long> postIds);

	/**
	 * 处理岗位删除时，删除关联授权数据
	 *
	 * @param userId 用户编号
	 */
	AjaxResult processPostDeleted(Long userId);

	// ========== 用户-部门的相关方法 ==========
	/**
	 * 设置用户部门
	 *
	 * @param userId 角色编号
	 * @param deptIds 部门编号集合
	 */
	AjaxResult assignUserDept(Long userId, Set<Long> deptIds);

	/**
	 * 处理部门删除时，删除关联授权数据
	 *
	 * @param userId 用户编号
	 */
	AjaxResult processDeptDeleted(Long userId);

	/**
	 * 获取菜单
	 * 
	 * @param menuId
	 * @return
	 */
	SysMenu getMenuListByMenuId(Long menuId);

	/**
	 * 获取菜单s
	 * 
	 * @param menuIds
	 * @return
	 */
	List<SysMenu> getMenuListByMenuIds(Collection<Long> menuIds);

}
